Hash functions are mathematical operations run on arbitrary data. By comparing the output hash value from execution of the hash function to a known and expected hash value, the integrity of the input data can be determined. For example, computing the hash of a downloaded file and comparing the result to a previously published hash result for that file can show whether the download has been modified or tampered with. Hash functions are conventionally classified as non-cryptographic and cryptographic, which represents a strength/speed tradeoff. Non-cryptographic hash functions run faster than cryptographic hash functions, but are not as secure, making them most useful in time-sensitive tasks or in tasks where security need not be as strong, e.g., generating random numbers, bloom filters, and message authentication for short-lived messages. Cryptographic hash functions are much more secure, but run too slowly for large-scale or time-sensitive use. A key aspect of secure hash functions is their collision resistance: two different input values should not result in the same hash output. More secure hash functions are more collision resistant due to mixing of the input, which makes it difficult to find a pre-image, i.e., input that hashes to a given output. But mixing increases processing time. Thus, in hash functions, there is a trade-off between security and processing time.